/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.folha.service;

import java.io.Serializable;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 *
 * @author marceloml
 */
public class GradeService implements Serializable{
    
    private static final long serialVersionUID = 1L;
    private Date dataAulaComparacao;
    private Date dataAtualComparacao;
    
        public Date calculaData(Date reference , int dayOfWeek){  

                 Calendar calendar = Calendar.getInstance(); // ou new GregorianCalendar  
                 calendar.clear();  
                 calendar.setTime(reference);  

                 while ( calendar.get(Calendar.DAY_OF_WEEK) != dayOfWeek){  
                        calendar.add(Calendar.DAY_OF_MONTH,1); // verifica o proximo dia  
                 }  

                  // ao sair do while, a data no calendar será a que queremos                   
                 return calendar.getTime();  
        }    
        
        public Date calculaDataAnterior(Date reference , int dayOfWeek){  

                 Calendar calendar = Calendar.getInstance(); // ou new GregorianCalendar  
                 calendar.clear();  
                 calendar.setTime(reference);  

                 while ( calendar.get(Calendar.DAY_OF_WEEK) != dayOfWeek){  
                        calendar.add(Calendar.DAY_OF_MONTH,-1); // verifica o proximo dia  
                 }  

                  // ao sair do while, a data no calendar será a que queremos                   
                 return calendar.getTime();  
        }   
        
        public Date ultimoDiaMes(Date reference){  

                 Calendar calendar = Calendar.getInstance(); // ou new GregorianCalendar  
                 calendar.clear();  
                 calendar.setTime(reference);  

                 int dia = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
                 int mes = calendar.get(Calendar.MONTH + 1);
                 int ano = calendar.get(Calendar.YEAR);    
                 Date data = new Date();
                 
                try {
                    data = (new SimpleDateFormat("dd/MM/yyyy")).parse( dia+"/"+mes+"/"+ano );
                } catch (ParseException e) {
                    System.out.println("Falha na busca do último dia do mês");
                }                 

                  // ao sair do while, a data no calendar será a que queremos                   
                 return data;  
        }        

        /*
         * Método utilizado para validar se o usuário está incluindo uma aula com data e hora anterior 
         * a data e hora atual
         */
        public Boolean validaAula(Date dataAula, Date dataAtual, Date horaAula) throws ParseException{          
            
            SimpleDateFormat sd = new SimpleDateFormat("dd/MM/yyyy");

            dataAulaComparacao = sd.parse(sd.format(dataAula));
            dataAtualComparacao = sd.parse(sd.format(dataAtual)); 
            Boolean retorno = false;
            
            if(dataAulaComparacao.before(dataAtualComparacao)){
                
                retorno = true;    
                
            }else if(dataAulaComparacao.equals(dataAtualComparacao)){
                
                SimpleDateFormat hr = new SimpleDateFormat("HH:mm");
                
                if(hr.parse(hr.format(horaAula)).before(hr.parse(hr.format(dataAtual)))){
                
                    retorno = true;
                    
                }
                
            }else{
            
            retorno = false;
            
            }
            
            return retorno;
            
        }
        
        /*
         * Método utilizado para validar se as aulas incluídas pela geração automática da grade
         * serão somente para dias posteriores a data atual
         */
        public Boolean validaGrade(Date dataAula, Date dataAtual, Date horaAula) throws ParseException{            
            
            SimpleDateFormat sd = new SimpleDateFormat("dd/MM/yyyy");

            dataAulaComparacao = sd.parse(sd.format(dataAula));
            dataAtualComparacao = sd.parse(sd.format(dataAtual)); 
            Boolean retorno = false;
            
            if(dataAulaComparacao.after(dataAtualComparacao)){
                
                retorno = true;    
                
            }else if(dataAulaComparacao.equals(dataAtualComparacao)){
                
                SimpleDateFormat hr = new SimpleDateFormat("HH:mm");
                
                long agora = System.currentTimeMillis();
                dataAtual.setTime(agora);
                
                if(hr.parse(hr.format(dataAtual)).before(hr.parse(hr.format(horaAula)))){
                
                    retorno = true;
                    
                }
                
            }else{
            
            retorno = false;
            
            }
            
            return retorno;
            
        }        
    
}